home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 27 / CU Amiga Magazine's Super CD-ROM 27 (1998)(EMAP Images)(GB)[!][issue 1998-10].iso / CUCD / Programming / BlitzC2P / c2p040plusCLS.ascii < prev    next >
Text File  |  1998-07-27  |  10KB  |  534 lines

  1. WBStartup
  2. NoCli
  3.  
  4. ; CLEARSCREEN version. Additional code by Paul West.
  5.  
  6. ; Non-clearscreen results:
  7.  
  8. ; 040/25 results:
  9.  
  10. ; 320x200 @46fps DoublePAL or 49.2fps PAL
  11. ; 320x256 @34.2fps DoublePAL or 37.9fps PAL
  12. ; 320x240 @37fps DoublePAL or 40.6fps PAL
  13.  
  14. ; 060/50 results:
  15.  
  16. ; 320x256 @50fps PAL
  17. ; 320x200 @66fps PAL
  18.  
  19. #c2pBPLX=320
  20. #c2pBPLY=256
  21. #c2pBPLSIZE=(#c2pBPLX*#c2pBPLY)/8
  22.  
  23. #scrwidth=#c2pBPLX
  24. #scrheight=#c2pBPLY
  25. #screensize=#scrwidth*#scrheight
  26.  
  27. ; Date: 20-Jan-1998     Mikael Kalms (Scout/C-Lous & more)
  28. ;         Email: mikael@kalms.org
  29. ;
  30. ; About:
  31. ;   1x1 8bpl cpu5 C2P for contigous bitplanes and no horizontal modulo
  32. ;
  33. ;   This routine is intended for use on all 68040 and 68060 based systems.
  34. ;   It is not designed to perform well on 68020-030.
  35. ;
  36. ;   This routine is released into the public domain. It may be freely used
  37. ;   for non-commercial as well as commercial purposes. A short notice via
  38. ;   email is always appreciated, though.
  39. ;
  40. ; Timings:
  41. ;   ~130% on (a1200 Blizzard) 040-25
  42. ;   Estimated to run at copyspeed on 040-40 and 060
  43. ;
  44. ; Features:
  45. ;   Performs CPU-only C2P conversion using rather state-of-the-art (as of
  46. ;   the creation date, anyway) techniques
  47. ;   Handles bitplanes creens of virtually any size (4GB)
  48. ;
  49. ; Restrictions:
  50. ;   Chunky-buffer must be an even multiple of 32 pixels wide
  51. ;   If incorrect/invalid parameters are specified, the routine will
  52. ;   most probably crash.
  53. ;
  54. ; c2p1x1_8_c5_040_smcinit   changes the bitplane-size &
  55. ;         chunkybuffer size/pos
  56. ; c2p1x1_8_c5_040_init      sets only the chunkybuffer size/pos
  57. ; c2p1x1_8_c5_040     performs the actual c2p conversion
  58. ;
  59.  
  60. Statement c2p040prefs{A.l,B.l,C.l,D.l}
  61.  
  62.   ;This routine DOES NOT WORK!
  63.  
  64.   ;A.l=d0=width.w
  65.   ;B.l=d1=height.w
  66.   ;C.w=d2=planarwidth.w
  67.   ;D.w=d3=planarheight.w
  68.  
  69.   MULU  d2,d3
  70.   MOVE.l  d3,d5
  71.  
  72. ; d0.w  chunkyx [chunky-pixels]
  73. ; d1.w  chunkyy [chunky-pixels]
  74. ; d3.w  scroffsy [screen-pixels]
  75. ; d5.l  bplsize [bytes] -- offset between one row in one bpl and the next bpl
  76.  
  77.   MOVEQ.l #0,d3 ; Y offset
  78.  
  79. _c2p1x1_8_c5_040_smcinit
  80. c2p1x1_8_c5_040_smcinit
  81.   MOVEM.l d3/a6,-(a7)
  82.   MULU.w  d0,d3
  83.   LSR.l #3,d3
  84.   MOVE.l  d3,c2p1x1_8_c5_040_scroffs
  85.   MULU.w  d0,d1
  86.   MOVE.l  d1,c2p1x1_8_c5_040_pixels
  87.   MOVE.l  d5,d0
  88.   LSL.l #3,d0
  89.   SUB.l d5,d0
  90.   MOVE.l  d0,c2p1x1_8_c5_040_smc1-4
  91.   ADDQ.l  #4,d0
  92.   MOVE.l  d0,c2p1x1_8_c5_040_smc5-4
  93.   MOVE.l  d5,d0
  94.   LSL.l #2,d0
  95.   MOVE.l  d0,c2p1x1_8_c5_040_smc2-4
  96.   MOVE.l  d0,c2p1x1_8_c5_040_smc4-4
  97.   MOVE.l  d0,c2p1x1_8_c5_040_smc6-4
  98.   MOVE.l  d0,c2p1x1_8_c5_040_smc8-4
  99.   MOVE.l  d0,c2p1x1_8_c5_040_smc10-4
  100.   MOVE.l  d0,c2p1x1_8_c5_040_smc12-4
  101.   SUB.l d5,d0
  102.   MOVE.l  d0,c2p1x1_8_c5_040_smc3-4
  103.   MOVE.l  d0,c2p1x1_8_c5_040_smc7-4
  104.   MOVE.l  d0,c2p1x1_8_c5_040_smc9-4
  105.   MOVE.l  d0,c2p1x1_8_c5_040_smc11-4
  106.   MOVE.l  execbase,a6
  107.   JSR _LVOCacheClearU(a6)
  108.   MOVEM.l (a7)+,d3/a6
  109. AsmExit
  110. End Statement
  111.  
  112. Statement c2p040init{A.l,B.l}
  113.  
  114.   ;A.l=d0=Width.w
  115.   ;B.l=d1=Height.w
  116.  
  117. ; d0.w  chunkyx [chunky-pixels]
  118. ; d1.w  chunkyy [chunky-pixels]
  119. ; d3.w  scroffsy [screen-pixels]
  120.  
  121.   MOVEQ.l #0,d3 ; Y offset
  122.  
  123. _c2p1x1_8_c5_040_init
  124. c2p1x1_8_c5_040_init
  125.   MULU.w  d0,d3
  126.   LSR.l #3,d3
  127.   MOVE.l  d3,c2p1x1_8_c5_040_scroffs
  128.   MULU.w  d0,d1
  129.   MOVE.l  d1,c2p1x1_8_c5_040_pixels
  130. AsmExit
  131. End Statement
  132.  
  133. Statement c2p040{A.l,B.l}
  134.  
  135.   MOVE.l  d0,a0 ; Chunky
  136.   MOVE.l  d1,a1 ; Planar
  137.  
  138. ; a0  c2pscreen
  139. ; a1  bitplanes
  140. #_LVOCacheClearU=-$27C
  141. #execbase=$4
  142. _c2p1x1_8_c5_040
  143. c2p1x1_8_c5_040
  144.   MOVEM.l a3-a6,-(a7)
  145.   MOVE.l  a7,stackstore
  146.   MOVE.l  #0,a7
  147.   ADD.l #c2pBPLSIZE*7,a1
  148. c2p1x1_8_c5_040_smc1
  149.   ADD.l c2p1x1_8_c5_040_scroffs,a1
  150.  
  151.   MOVE.l  c2p1x1_8_c5_040_pixels,a2
  152.   MOVE.l  a2,d0 ; byPWest
  153.   TST.l d0 ;
  154.   BEQ _none
  155.   ADD.l a0,a2
  156.  
  157.   MOVE.l  (a0),d0
  158.   MOVE.l  a7,(a0)+
  159.   MOVE.l  (a0),d1
  160.   MOVE.l  a7,(a0)+
  161.   MOVE.l  (a0),d2
  162.   MOVE.l  a7,(a0)+
  163.   MOVE.l  (a0),d3
  164.   MOVE.l  a7,(a0)+
  165.   MOVE.l  (a0),d4
  166.   MOVE.l  a7,(a0)+
  167.   MOVE.l  (a0),d5
  168.   MOVE.l  a7,(a0)+
  169.   MOVE.l  (a0),a5
  170.   MOVE.l  a7,(a0)+
  171.   MOVE.l  (a0),a6
  172.   MOVE.l  a7,(a0)+
  173.  
  174.   SWAP  d4      ; Swap 16x4, part 1
  175.   SWAP  d5
  176.   EOR.w d0,d4
  177.   EOR.w d1,d5
  178.   EOR.w d4,d0
  179.   EOR.w d5,d1
  180.   EOR.w d0,d4
  181.   EOR.w d1,d5
  182.   SWAP  d4
  183.   SWAP  d5
  184.  
  185.   MOVE.l  d4,d6     ; Swap 2x4, part 1
  186.   MOVE.l  d5,d7
  187.   LSR.l #2,d6
  188.   LSR.l #2,d7
  189.   EOR.l d0,d6
  190.   EOR.l d1,d7
  191.   AND.l #$33333333,d6
  192.   AND.l #$33333333,d7
  193.   EOR.l d6,d0
  194.   EOR.l d7,d1
  195.   LSL.l #2,d6
  196.   LSL.l #2,d7
  197.   EOR.l d6,d4
  198.   EOR.l d7,d5
  199.  
  200.   EXG d4,a5
  201.   EXG d5,a6
  202.  
  203.   SWAP  d4      ; Swap 16x4, part 2
  204.   SWAP  d5
  205.   EOR.w d2,d4
  206.   EOR.w d3,d5
  207.   EOR.w d4,d2
  208.   EOR.w d5,d3
  209.   EOR.w d2,d4
  210.   EOR.w d3,d5
  211.   SWAP  d4
  212.   SWAP  d5
  213.  
  214.   MOVE.l  d4,d6     ; Swap 2x4, part 1
  215.   MOVE.l  d5,d7
  216.   LSR.l #2,d6
  217.   LSR.l #2,d7
  218.   EOR.l d2,d6
  219.   EOR.l d3,d7
  220.   AND.l #$33333333,d6
  221.   AND.l #$33333333,d7
  222.   EOR.l d6,d2
  223.   EOR.l d7,d3
  224.   LSL.l #2,d6
  225.   LSL.l #2,d7
  226.   EOR.l d6,d4
  227.   EOR.l d7,d5
  228.  
  229.   MOVE.l  d1,d6     ; Swap 4x1, part 1
  230.   MOVE.l  d3,d7
  231.   LSR.l #4,d6
  232.   LSR.l #4,d7
  233.   EOR.l d0,d6
  234.   EOR.l d2,d7
  235.   AND.l #$0f0f0f0f,d6
  236.   AND.l #$0f0f0f0f,d7
  237.   EOR.l d6,d0
  238.   EOR.l d7,d2
  239.   LSL.l #4,d6
  240.   LSL.l #4,d7
  241.   EOR.l d6,d1
  242.   EOR.l d7,d3
  243.  
  244.   BRA _start
  245.  
  246.   Even8
  247.   Even8
  248. _x
  249.   MOVE.l  (a0),d0
  250.   MOVE.l  a7,(a0)+
  251.   MOVE.l  (a0),d1
  252.   MOVE.l  a7,(a0)+
  253.   MOVE.l  (a0),d2
  254.   MOVE.l  a7,(a0)+
  255.   MOVE.l  (a0),d3
  256.   MOVE.l  a7,(a0)+
  257.   MOVE.l  (a0),d4
  258.   MOVE.l  a7,(a0)+
  259.   MOVE.l  (a0),d5
  260.   MOVE.l  a7,(a0)+
  261.   MOVE.l  (a0),a5
  262.   MOVE.l  a7,(a0)+
  263.   MOVE.l  (a0),a6
  264.   MOVE.l  a7,(a0)+
  265.  
  266.   MOVE.l  d6,(a1)
  267.   SUB.l #c2pBPLSIZE*4,a1
  268. c2p1x1_8_c5_040_smc2
  269.  
  270.   SWAP  d4      ; Swap 16x4, part 1
  271.   SWAP  d5
  272.   EOR.w d0,d4
  273.   EOR.w d1,d5
  274.   EOR.w d4,d0
  275.   EOR.w d5,d1
  276.   EOR.w d0,d4
  277.   EOR.w d1,d5
  278.   SWAP  d4
  279.   SWAP  d5
  280.  
  281.   MOVE.l  d7,(a1)
  282.   ADD.l #c2pBPLSIZE*3,a1
  283. c2p1x1_8_c5_040_smc3
  284.  
  285.   MOVE.l  d4,d6     ; Swap 2x4, part 1
  286.   MOVE.l  d5,d7
  287.   LSR.l #2,d6
  288.   LSR.l #2,d7
  289.   EOR.l d0,d6
  290.   EOR.l d1,d7
  291.   AND.l #$33333333,d6
  292.   AND.l #$33333333,d7
  293.   EOR.l d6,d0
  294.   EOR.l d7,d1
  295.   LSL.l #2,d6
  296.   LSL.l #2,d7
  297.   EOR.l d6,d4
  298.   EOR.l d7,d5
  299.  
  300.   EXG d4,a5
  301.   EXG d5,a6
  302.  
  303.   SWAP  d4      ; Swap 16x4, part 2
  304.   SWAP  d5
  305.   EOR.w d2,d4
  306.   EOR.w d3,d5
  307.   EOR.w d4,d2
  308.   EOR.w d5,d3
  309.   EOR.w d2,d4
  310.   EOR.w d3,d5
  311.   SWAP  d4
  312.   SWAP  d5
  313.  
  314.   MOVE.l  a3,(a1)
  315.   SUB.l #c2pBPLSIZE*4,a1
  316. c2p1x1_8_c5_040_smc4
  317.  
  318.   MOVE.l  d4,d6     ; Swap 2x4, part 1
  319.   MOVE.l  d5,d7
  320.   LSR.l #2,d6
  321.   LSR.l #2,d7
  322.   EOR.l d2,d6
  323.   EOR.l d3,d7
  324.   AND.l #$33333333,d6
  325.   AND.l #$33333333,d7
  326.   EOR.l d6,d2
  327.   EOR.l d7,d3
  328.   LSL.l #2,d6
  329.   LSL.l #2,d7
  330.   EOR.l d6,d4
  331.   EOR.l d7,d5
  332.  
  333.   MOVE.l  d1,d6     ; Swap 4x1, part 1
  334.   MOVE.l  d3,d7
  335.   LSR.l #4,d6
  336.   LSR.l #4,d7
  337.   EOR.l d0,d6
  338.   EOR.l d2,d7
  339.   AND.l #$0f0f0f0f,d6
  340.   AND.l #$0f0f0f0f,d7
  341.   EOR.l d6,d0
  342.   EOR.l d7,d2
  343.   LSL.l #4,d6
  344.   LSL.l #4,d7
  345.   EOR.l d6,d1
  346.   EOR.l d7,d3
  347.  
  348.   MOVE.l  a4,(a1)
  349.   ADD.l #c2pBPLSIZE*7+4,a1
  350. c2p1x1_8_c5_040_smc5
  351.  
  352. _start
  353.   MOVE.l  d2,d6     ; Swap 8x2, part 1
  354.   MOVE.l  d3,d7
  355.   LSR.l #8,d6
  356.   LSR.l #8,d7
  357.   EOR.l d0,d6
  358.   EOR.l d1,d7
  359.   AND.l #$00ff00ff,d6
  360.   AND.l #$00ff00ff,d7
  361.   EOR.l d6,d0
  362.   EOR.l d7,d1
  363.   LSL.l #8,d6
  364.   LSL.l #8,d7
  365.   EOR.l d6,d2
  366.   EOR.l d7,d3
  367.  
  368.   MOVE.l  d2,d6     ; Swap 1x2, part 1
  369.   MOVE.l  d3,d7
  370.   LSR.l #1,d6
  371.   LSR.l #1,d7
  372.   EOR.l d0,d6
  373.   EOR.l d1,d7
  374.   AND.l #$55555555,d6
  375.   AND.l #$55555555,d7
  376.   EOR.l d6,d0
  377.   EOR.l d7,d1
  378.   LSL.l #1,d6
  379.   LSL.l #1,d7
  380.   EOR.l d6,d2
  381.   EOR.l d7,d3
  382.  
  383.   MOVE.l  d0,(a1)
  384.   SUB.l #c2pBPLSIZE*4,a1
  385. c2p1x1_8_c5_040_smc6
  386.  
  387.   MOVE.l  a5,d6
  388.   MOVE.l  a6,d7
  389.   MOVE.l  d2,a3
  390.   MOVE.l  d3,a4
  391.  
  392.   MOVE.l  d5,d2     ; Swap 4x1, part 2
  393.   MOVE.l  d7,d3
  394.   LSR.l #4,d2
  395.   LSR.l #4,d3
  396.   EOR.l d4,d2
  397.   EOR.l d6,d3
  398.   AND.l #$0f0f0f0f,d2
  399.   AND.l #$0f0f0f0f,d3
  400.   EOR.l d2,d4
  401.   EOR.l d3,d6
  402.  
  403.   MOVE.l  d1,(a1)
  404.   ADD.l #c2pBPLSIZE*3,a1
  405. c2p1x1_8_c5_040_smc7
  406.  
  407.   LSL.l #4,d2
  408.   LSL.l #4,d3
  409.   EOR.l d2,d5
  410.   EOR.l d3,d7
  411.  
  412.   MOVE.l  d4,d2     ; Swap 8x2, part 2
  413.   MOVE.l  d5,d3
  414.   LSR.l #8,d2
  415.   LSR.l #8,d3
  416.   EOR.l d6,d2
  417.   EOR.l d7,d3
  418.   AND.l #$00ff00ff,d2
  419.   AND.l #$00ff00ff,d3
  420.   EOR.l d2,d6
  421.   EOR.l d3,d7
  422.  
  423.   MOVE.l  a3,(a1)
  424.   SUB.l #c2pBPLSIZE*4,a1
  425. c2p1x1_8_c5_040_smc8
  426.  
  427.   LSL.l #8,d2
  428.   LSL.l #8,d3
  429.   EOR.l d2,d4
  430.   EOR.l d3,d5
  431.  
  432.   MOVE.l  d4,d2     ; Swap 1x2, part 2
  433.   MOVE.l  d5,d3
  434.   LSR.l #1,d2
  435.   LSR.l #1,d3
  436.   EOR.l d6,d2
  437.   EOR.l d7,d3
  438.   AND.l #$55555555,d2
  439.   AND.l #$55555555,d3
  440.  
  441.   MOVE.l  a4,(a1)
  442.   ADD.l #c2pBPLSIZE*3,a1
  443. c2p1x1_8_c5_040_smc9
  444.  
  445.   EOR.l d2,d6
  446.   EOR.l d3,d7
  447.   LSL.l #1,d2
  448.   LSL.l #1,d3
  449.   EOR.l d2,d4
  450.   EOR.l d3,d5
  451.  
  452.   MOVE.l  d4,a3
  453.   MOVE.l  d5,a4
  454.  
  455.   CMP.l a0,a2
  456.   BNE _x
  457.  
  458.   MOVE.l  d6,(a1)
  459.   SUB.l #c2pBPLSIZE*4,a1
  460. c2p1x1_8_c5_040_smc10
  461.   MOVE.l  d7,(a1)
  462.   ADD.l #c2pBPLSIZE*3,a1
  463. c2p1x1_8_c5_040_smc11
  464.   MOVE.l  a3,(a1)
  465.   SUB.l #c2pBPLSIZE*4,a1
  466. c2p1x1_8_c5_040_smc12
  467.   MOVE.l  a4,(a1)
  468.  
  469. _none
  470.   MOVE.l  stackstore(pc),a7
  471.   MOVEM.l (a7)+,a3-a6
  472. AsmExit
  473.  
  474. Even4
  475. stackstore: Dc.l 0
  476. c2p1x1_8_c5_040_scroffs: Dc.l 0
  477. c2p1x1_8_c5_040_pixels: Dc.l 0
  478. End Statement
  479.  
  480.  
  481.  
  482.  
  483.  
  484. .blitzprogram
  485. ; Setup
  486. InitBank 0,(#scrwidth*#scrheight)+1000,2|65536 ; Chipram planar buffer
  487. CludgeBitMap 0,#scrwidth,#scrheight,8,Bank(0)
  488. InitPalette 0,256
  489. For c=0 To 255
  490.   AGAPalRGB 0,c,Rnd(c),Rnd(c),Rnd(c)
  491. Next c
  492. AGAPalRGB 0,0,0,0,0
  493. Screen 0,0,0,#scrwidth,#scrheight,8,0,"c2p test",0,0,0
  494. Use Palette 0
  495. VWait 50
  496. baseaddress1.l=AllocMem(#scrwidth*#scrheight,$10000) ; Fastram chunky buffer
  497.  
  498. ; Put something into the chunky buffer so we can see it working
  499. GetReg a0,baseaddress1
  500. MOVE.l  #0,d0
  501. MOVE.l  #screensize-1,d1
  502. cloop
  503.   MOVE.b  d0,(a0)+
  504.   ADDQ.l  #1,d0
  505.   SUBQ.l  #1,d1
  506.   TST.l   d1
  507.   BLT     done
  508.   BRA     cloop
  509. done
  510.  
  511. ; Do the c2p test
  512. c2p040init{#scrwidth,#scrheight}
  513. VWait 20
  514. Forbid_
  515. VWait
  516. ResetTimer
  517. For time=1 To 800
  518.   c2p040{baseaddress1,Bank(0)} ; Convert chunky to planar
  519. Next time
  520. t=Ticks
  521. VWait 2 : Permit_
  522. VWait 20
  523. FindScreen 0
  524. Window 0,0,11,640,100,0,"Test results for c2p",0,0
  525. WindowOutput 0
  526. NPrint "Routine performed @ ",50/(t/800),"fps - ",t," ticks"
  527. NPrint " "
  528. NPrint "Press mousebutton..."
  529. Free Screen 0
  530. MouseWait
  531. Free Window 0
  532. End
  533.  
  534.